// api/request.js
import Config from '@/config'; // 建议使用绝对路径
import {useUserStore} from "../stores";
const { API_BASE_URL, CLIENT_ID, TENANT } = Config;

// 创建请求实例
function request(options) {
    // 1. 合并配置
    const token = uni.getStorageSync('token');

    const config = {
        url: API_BASE_URL.replace(/\/+$/, '') + '/' + options.url.replace(/^\/+/, ''),
        method: options.method || 'GET',
        data: options.data || {},
        header: {
            'Content-Type': 'application/json',
            'Authorization': token ? `Bearer ${token}` : '',
            'Clientid': CLIENT_ID,
            'tenant': TENANT,
            ...(options.header || {}) // 允许外部 header 覆盖
        }
    };

    // 2. 可选：请求时显示 loading
    // if (!options.hideLoading) {
    //   uni.showLoading({ title: '请求中...' });
    // }

    return new Promise((resolve, reject) => {
        uni.request({
            ...config,
            success: (res) => {
                const { statusCode, data } = res;

                // 3. HTTP 状态码判断
                if (statusCode >= 200 && statusCode < 300) {
                    // 4. 业务逻辑判断（假设后端返回 { code: 0, msg: '', data: {} }）
                    if (data.code === 200) {
                        resolve(data); // 成功
                    } else {
                        if (data.code === 401) {
                            // 登录失效401
                            console.warn('[Request] 登录态失效，即将跳转登录页');
                            useUserStore().logout();
                            // 跳转登录页
                            uni.redirectTo({ url: '/packages/system/login' });
                            reject(new Error('登录已过期'));
                        }
                        // 业务失败
                        const msg = data.msg || '请求失败';
                        uni.showToast({ title: msg, icon: 'none' });
                        reject(data); // 失败
                    }

                    // 请求异常
                    reject(res);
                } else {
                    // HTTP 错误
                    const errorMsg = (data && data.msg) || (data && typeof data === 'string' ? data : '请求失败');
                    uni.showToast({ title: errorMsg, icon: 'none' });
                    reject(res);
                }
            },
            fail: (err) => {
                console.error('[Request] 网络异常', err);
                uni.showToast({ title: '网络连接失败', icon: 'none' });
                reject(err);
            },
            complete: () => {
                // 5. 隐藏 loading（如果开启了）
                // if (!options.hideLoading) {
                //   uni.hideLoading();
                // }
            }
        });
    });
}

// 6. 语法糖：支持 _get / _post
request.get = function(url, data, options = {}) {
    return request({
        url,
        method: 'GET',
        data,
        ...options
    });
};

request.post = function(url, data, options = {}) {
    return request({
        url,
        method: 'POST',
        data,
        ...options
    });
};

export default request;